package com.example.java_websocket.service.impl;

import com.example.java_websocket.model.User;
import com.example.java_websocket.service.IOnlineUserService;
import com.example.java_websocket.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Set;
import java.util.concurrent.TimeUnit;

@Service
public class OnlineUserServiceImpl implements IOnlineUserService {
    //通过 Redis 的集合（Set）数据结构来管理在线用户
    //ONLINE_USERS_KEY:Redis 中的键（key），用来存储在线用户的集合。
    //chat:online_users，表示这是一个与聊天相关的在线用户列表。
    private static final String ONLINE_USERS_KEY = "chat:online_users";

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Autowired
    private IUserService UserService;

    //用户上线
    @Override
    public void userLogin(String userId) {
        User detail = UserService.detail(userId);
        if (detail == null){
            return;
        }
        redisTemplate.opsForSet().add(ONLINE_USERS_KEY, userId + ":" + detail.getName());
        //设置集合的过期时间为 1 天，避免数据长期占用内存。
        redisTemplate.expire(ONLINE_USERS_KEY, 1, TimeUnit.DAYS);
    }
    //用户下线
    @Override
    public void userLogout(String userId) {
        // redis移除指定set中的值( key为: "chat:online_users" )
        redisTemplate.opsForSet().remove(ONLINE_USERS_KEY, userId);
    }
    @Override
    // 获取在线用户列表
    public Set<String> getOnlineUsers() {
        // 返回redis在线用户列表的数组
        return redisTemplate.opsForSet().members(ONLINE_USERS_KEY);
    }
}
